//
// Created by tanji on 2025/3/23.
//
#include "WebServer.h"
WebServer::WebServer(GlobalConfig& config) : config(config), server(80),lastLoopTime(0),loopInterval(5000)  {}
void WebServer::init() {
    // 可以在这里进行一些初始化操作，例如连接到服务器等
    // 目前暂不做具体操作
    debugLog("WebClient initialized.\n");
}

void WebServer::loop() {

    if (GlobalConstants::startWebConfig) {
        // 启动 http服务逻辑 首次启动连续5次没连上网触发，
        server.handleClient();
    }
    // 实现定时发送 HTTP 请求
    // 这里简单示例，后续可根据需求使用定时器
    unsigned long currentTime = millis();
    if (currentTime - lastLoopTime >= loopInterval) {
//        sendRequest();
        lastLoopTime = currentTime;
    }
}
// 处理停止服务器请求
void WebServer::handleStopServer() {
    server.send(200, "text/plain", "Server stopped successfully!");
//    关闭服务器
    server.stop();
    // 重启设备
    ESP.reset();
    delay(3000);
}


// 初始化 Web 服务器
void WebServer::setupWebServer() {
    debugLog("Web server started\n");
    // 开启 Web 配网服务
    WiFi.softAP(GlobalConstants::SOFTAP_SSID, GlobalConstants::SOFTAP_PASSWORD);
    GlobalConstants::startWebConfig=true;
    // 注册路由
    server.on("/", std::bind(&WebServer::handleRoot, this));
    server.on("/stopServer", std::bind(&WebServer::handleStopServer, this));
    server.on("/save", std::bind(&WebServer::handleAllConfig, this));
    server.begin();
}

// 处理根路径请求
void WebServer::handleRoot() {
    std::string page = htmlTemplate.generatePage(config);
    server.send(200, "text/html", page.c_str());
}
// 处理所有配置请求
void WebServer::handleAllConfig() {
    // 手动为字符串类型参数赋值
    if (!server.arg("wifiSSID").isEmpty()) {
        config.setWifiSsid(std::string(server.arg("wifiSSID").c_str()));
    }
    if (!server.arg("wifiPassword").isEmpty()) {
        config.setWifiPassword(std::string(server.arg("wifiPassword").c_str()));
    }
    if (!server.arg("mqttServer").isEmpty()) {
        config.setMqttServer(std::string(server.arg("mqttServer").c_str()));
    }
    if (!server.arg("mqttSSLCA").isEmpty()) {
        config.setMqttSslca(std::string(server.arg("mqttSSLCA").c_str()));
    }
    if (!server.arg("mqttPort").isEmpty()) {
        config.setMqttPort(std::string(server.arg("mqttPort").c_str()));
    }
    if (!server.arg("mqttClientId").isEmpty()) {
        config.setMqttClientId(std::string(server.arg("mqttClientId").c_str()));
    }
    if (!server.arg("mqttUser").isEmpty()) {
        config.setMqttUser(std::string(server.arg("mqttUser").c_str()));
    }
    if (!server.arg("mqttPassword").isEmpty()) {
        config.setMqttPassword(std::string(server.arg("mqttPassword").c_str()));
    }
    if (!server.arg("mqttTopicControl").isEmpty()) {
        config.setMqttTopicControl(std::string(server.arg("mqttTopicControl").c_str()));
    }
    if (!server.arg("mqttTopicStatus").isEmpty()) {
        config.setMqttTopicStatus(std::string(server.arg("mqttTopicStatus").c_str()));
    }
    if (!server.arg("mqttTopicTimer").isEmpty()) {
        config.setMqttTopicTimer(std::string(server.arg("mqttTopicTimer").c_str()));
    }
    if (!server.arg("mqttTopicResetTimer").isEmpty()) {
        config.setMqttTopicResetTimer(std::string(server.arg("mqttTopicResetTimer").c_str()));
    }
    if (!server.arg("httpApiUrl").isEmpty()) {
        config.setHttpApiUrl(std::string(server.arg("httpApiUrl").c_str()));
    }
    if (!server.arg("mqttSSLCAOpen").isEmpty()) {
        config.setMqttSslcaOpen(std::string(server.arg("mqttSSLCAOpen").c_str()));
    }
    if (!server.arg("httpApiType").isEmpty()) {
        config.setHttpApiType(std::string(server.arg("httpApiType").c_str()));
    }

    // 手动为无符号整数类型参数赋值
    if (!server.arg("wifiErrSec").isEmpty()) {
        config.setWifiErrSec(parseUnsignedIntArg(std::string(server.arg("wifiErrSec").c_str())));
    }
    if (!server.arg("wifiErrSecOpenWebConf").isEmpty()) {
        config.setWifiErrSecOpenWebConf(parseUnsignedIntArg(std::string(server.arg("wifiErrSecOpenWebConf").c_str())));
    }
    if (!server.arg("webServerEndSecSet").isEmpty()) {
        config.setWebServerEndSecSet(parseUnsignedIntArg(std::string(server.arg("webServerEndSecSet").c_str())));
    }
    if (!server.arg("webServerEndSec").isEmpty()) {
        config.setWebServerEndSec(parseUnsignedIntArg(std::string(server.arg("webServerEndSec").c_str())));
    }
    if (!server.arg("mqttErrSec").isEmpty()) {
        config.setMqttErrSec(parseUnsignedIntArg(std::string(server.arg("mqttErrSec").c_str())));
    }
    if (!server.arg("mqttErrSecOpenWebConf").isEmpty()) {
        config.setMqttErrSecOpenWebConf(parseUnsignedIntArg(std::string(server.arg("mqttErrSecOpenWebConf").c_str())));
    }
    // 手动为无符号长整数类型参数赋值
    if (!server.arg("startTime").isEmpty()) {
        config.setStartTime(parseUnsignedLongArg(std::string(server.arg("startTime").c_str())));
    }
    if (!server.arg("endTime").isEmpty()) {
        config.setEndTime(parseUnsignedLongArg(std::string(server.arg("endTime").c_str())));
    }
    // 手动为布尔类型参数赋值
    if (!server.arg("switchStatus").isEmpty()) {
        config.setSwitchStatus(parseBoolArg(std::string(server.arg("switchStatus").c_str())));
    }

    config.saveConfig();
    // if (wifiConnected) {
    //       connectServices();
    // }
    std::string page = htmlTemplate.generatePage(config);
    server.send(200, "text/html", page.c_str());
    // handleStopServer();
}
